RPC 是一種讓程式能夠像調用本地函數一樣,調用位於遠端服務器上的函數或方法的技術。它的主要目的是簡化分布式系統的開發,讓開發者無需關注底層的網絡通信細節。
gRPC(gRPC Remote Procedure Calls)是一個高性能、開源的遠程過程調用(RPC)框架,由 Google 開發並於 2015 年開源。gRPC 基於 HTTP/2 協議,並使用 Protocol Buffers(Protobuf)作為接口描述語言(IDL)和消息交換格式。由於其高效、靈活和多語言支持,gRPC 已成為現代微服務架構中常用的通信解決方案。
在比較傳統的 RPC 與 gRPC 時,主要的差異體現在訊息格式、效能、傳輸協定等多個方面。以下是兩者的關鍵區別:
功能 | RPC | gRPC |
---|---|---|
訊息格式 | 通常使用 JSON 或 XML 等基於文字的格式進行訊息序列化 | 使用 Protocol Buffers(protobuf)這種二進位格式 |
效能 | 基於文字的格式通常效能較低,延遲較高 | 二進位格式更適合網路傳輸,實現更低的延遲和更好的效能 |
機器可讀性 | 較低,需要額外工具解析文字格式 | Protocol Buffers 訊息是嚴謹可讀的,工具更容易解析和理解交換的訊息 |
傳輸協定 | 可以使用多種傳輸協定,包括 HTTP/1.1、TCP | 專門使用 HTTP/2 |
多路復用 (Multiplexing) | 不支援或支援有限 | 允許在單一連線上多路復用多個請求,減少開銷並提高效能 |
流量控制 (Flow Control) | 不支援或支援有限 | 提供更好的流量控制機制,管理資料傳輸,防止擁塞並提高回應能力 |
速度 | 基於 HTTP/1.1 的 REST 通常較慢 | 基於 HTTP/2 的 gRPC 比 HTTP/1.1 的 REST 更快,且效率更高 |
截止日期/逾時 (Deadlines/Timeouts) | 通常需自行實現 | 內建支援,確保請求不會掛起,並自動處理解決逾時、網路問題等 |
生態系 (Ecosystem) | 支援有限,需依賴第三方工具 | 支援豐富,包括自動負載均衡、錯誤處理、負載平衡等功能 |
Streaming Support | 通常僅支援請求-響應式通訊 | 支援串流-響應和雙向串流,適合即時應用程式 |
程式語言支援 | 支援多種程式語言,如 Java、Python、C++、Go 等 | 擁有更豐富的語言支援生態系,特別是對 Go 和 Rust 等較新的語言 |
Client-Server 耦合性 | 低 | 高 |
使用場景 | 一般 Web API、CRUD 操作 | 高效能及低延遲系統、大數據傳輸、用於客戶端和伺服器端之間的即時或串流應用 |
gRPC 的工作流程通常包括以下幾個步驟:
.proto
文件,定義服務接口及其方法和消息結構。protoc
)生成相應語言的客戶端和服務端代碼。gRPC Stub
Protocol Buffer(協定緩衝區)
Proto 檔案
功能 | GraphQL | REST | gRPC |
---|---|---|---|
資料格式 | JSON | JSON、XML 等(基於文本) | Protocol Buffers(Binary) |
協議 | HTTP/1.1 或 HTTP/2 | HTTP/1.1 或 HTTP/2 | HTTP/2 |
瀏覽器支援 | 適用於所有瀏覽器 | 適用於所有瀏覽器 | 支援有限 |
資料獲取 | 客戶端指定所需的精確資料 | 客戶端通過預定義的端點獲取資料 | 客戶端指定所需的精確資料 |
API 合約 | 強型別、基於查詢 | 鬆散,依賴文檔 | 強型別,基於 Schema |
版本控制 | 通常無版本控制,通過 Schema 演進 | URL、標頭、版本化的媒體類型 | 通過訊息類型或字段進行版本控制 |
學習曲線 | 中等 | 簡單 | 簡單 |
實時支援 | 有限的實時能力(需要訂閱) | 有限的實時能力(需要 WebSocket) | 支援雙向流 |
錯誤處理 | 錯誤對象嵌在成功回應中 | HTTP 狀態碼,自定義回應 | 通過 gRPC 狀態碼標準化 |
Client-Server 耦合性 | 低 | 低 | 高 |
程式碼產生 | 通過 GraphQL 工具自動生成 | 第三方工具 (如:Swagger) | 原生 Protobuf 編譯器 |
通訊方式 | 1 to 1 | 1 to 1 | 1 to 1/1 to M/M to 1/M to M |
雙向串流 | ❌ | ❌ | ✅ |
API 呼叫方式 | 使用 GraphQL 查詢語言呼叫 | 使用對應 HTTP Method 呼叫 Endpoint URL | 像是呼叫 Function 一樣 |
Response 格式定義 | 定義在 GraphQL Schema | 由 Server 定義 (通常為 JSON) | 定義在 proto 檔案內 |
使用場景 | 複雜查詢、移動應用 API、需要靈活的資料獲取的應用 | 一般 Web API、CRUD 操作 | 高效能及低延遲系統、大數據負載、用於客戶端和伺服器端之間的即時或串流應用 |
gRPC 是一個輕量級且高效的資料擷取系統,其核心優勢在於合約描述的方式。與傳統架構不同,gRPC 強調合約的重要性,而非架構本身在協商中的主導地位。這意味著伺服器與客戶端之間的互動主要依賴於預先定義的合約,而非架構設計的靈活性。
在 gRPC 中,雖然資料處理和計算由遠端伺服器負責,但大部分的運算負荷卻由客戶端承擔。這種設計使得客戶端能夠以較低的資源消耗進行高效的資料傳輸和處理。因此 gRPC 成為延遲敏感和高吞吐量應用程式的更好選擇。